package pe.gob.osce.sirenas.wd.jsf.bean.registro;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;

import pe.gob.osce.sirenas.model.AuditoriaDTO;
import pe.gob.osce.sirenas.model.FichaArbitralDTO;
import pe.gob.osce.sirenas.model.IncidenciasDTO;
import pe.gob.osce.sirenas.model.ReestablecerDTO;
import pe.gob.osce.sirenas.svc.RegistrarFichaArbitroServiceLocal;
import pe.gob.osce.sirenas.svc.RegistrarIncidenciaServiceLocal;
import pe.gob.osce.sirenas.wd.util.ConstanteWeb;
import pe.gob.osce.sirenas.wd.util.RepositorioDatos;
import pe.gob.osce.sirenas.wd.util.UBaseManage;

@ManagedBean(name="registroIncidenciasBean")
@SessionScoped
public class RegistroIncidenciasBean extends UBaseManage implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 4214133685499512002L;

	final static Logger log = Logger.getLogger(RegistroIncidenciasBean.class);

	@EJB
	private	RegistrarIncidenciaServiceLocal	registrarIncidenciaService;
	@EJB
	private	RegistrarFichaArbitroServiceLocal	registrarFichaArbitroService;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteWeb.PROPERTIES);
	private RequestContext context; 
	
	private List<IncidenciasDTO> listaIncidencias=new ArrayList<IncidenciasDTO>();
	private List<ReestablecerDTO> listaReestablecimientos=new ArrayList<ReestablecerDTO>();
	
	private ReestablecerDTO reestablecer=new ReestablecerDTO();
	private IncidenciasDTO incidencia=new IncidenciasDTO();
	private AuditoriaDTO auditoriaDTO;
	private FichaArbitralDTO fichaArbitral;
	private RepositorioDatos repositorioDatos;
	
	
	
	public void onload(){
		this.listaIncidencias=new ArrayList<IncidenciasDTO>();
		this.listaReestablecimientos=new ArrayList<ReestablecerDTO>();
		this.incidencia=new IncidenciasDTO();
		this.reestablecer=new ReestablecerDTO();
		this.fichaArbitral=(FichaArbitralDTO)obtenerObjetoSession(ConstanteWeb.FICHA_REGISTRO);
		repositorioDatos=obtenerRepositorioDatos();
		
		listaIncidenciasFicha();
		listaReestablecimientosFicha();
	}


	public void abrirReestablecerPopup(){
		this.incidencia=new IncidenciasDTO();
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogReestablecer').show();");
	}
	public void cerrarReestabecerPopup(){
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogReestablecer').hide();");
	}
	
	public void abrirRegistroPopup(){
		this.incidencia=new IncidenciasDTO();
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogRegistro').show();");
	}
	public void cerrarRegistroPopup(){
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogRegistro').hide();");
	}

	public void abrirVisorPopup(){
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogVisor').show();");
	}
	public void cerrarVisorPopup(){
		this.incidencia=new IncidenciasDTO();
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogVisor').hide();");
	}
	
	public boolean validarRegistroIncidencia(){
		if(this.incidencia.getIdEstadoIncidencia()>0 &&
			this.incidencia.getIdMotivoIncidencia()>0 &&
			this.incidencia.getObservacionIncidencia()!=null &&
			this.incidencia.getObservacionIncidencia().trim().length()>0){
			return true;
		}else{
			return false;
		}
	}

	public void desactivarRegistroIncidencia(Long idIncidencia){
		
		this.auditoriaDTO=(AuditoriaDTO)obtenerObjetoSession(ConstanteWeb.AUDITORIA);
		
		try {			
			for (IncidenciasDTO incidenciasDTO : this.listaIncidencias) {
				if(incidenciasDTO.getIdIncidencia()==idIncidencia){
					this.incidencia=incidenciasDTO;
					break;
				}
			}
										
			registrarIncidenciaService.desactivarIncidencia(this.incidencia,this.fichaArbitral, this.auditoriaDTO);
			
			this.incidencia=new IncidenciasDTO();			

			this.fichaArbitral=registrarFichaArbitroService.obtenerFichaArbitral(this.fichaArbitral);	
			String[] descEstado=repositorioDatos.getDescriptoresEstadoLista(this.fichaArbitral.getEstadoFicha().getIdEstado());
			this.fichaArbitral.getEstadoFicha().setNomEstado(descEstado[2]);
			if(this.fichaArbitral.getTipoFicha().equals(ConstanteWeb.TIPO_FICHA.ARBITRO.toString())){
				if(this.fichaArbitral.getIndModalidadArbitro()!=null){
					this.fichaArbitral.setModalidadArbitro(repositorioDatos.getDescModalidadArbitraje(this.fichaArbitral.getIndModalidadArbitro().longValue() ));
				}else{
					this.fichaArbitral.setModalidadArbitro("No registra");
				}
				
			}if(this.fichaArbitral.getTipoFicha().equals(ConstanteWeb.TIPO_FICHA.SECRETARIO.toString())){
				this.fichaArbitral.setModalidadArbitro(ConstanteWeb.TIPO_FICHA.SECRETARIO.toString());
			}
			
			establecerObjetoSession(ConstanteWeb.FICHA_REGISTRO, this.fichaArbitral);
			
			listaIncidenciasFicha();
			cerrarRegistroPopup();
			RequestContext.getCurrentInstance().update("gridFichaArbitro");
			setMensajeroInfo("Registrado Correctamente");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void guardarRegistroIncidencia(){
		
		this.auditoriaDTO=(AuditoriaDTO)obtenerObjetoSession(ConstanteWeb.AUDITORIA);
		
		if(validarRegistroIncidencia()){
			try {
				this.incidencia.setIdFicha(this.fichaArbitral.getIdFicha());
				this.incidencia.setActualizaEstado(repositorioDatos.getIndUpdateEstado(this.incidencia.getIdEstadoIncidencia()));
								
				registrarIncidenciaService.insertIncidencia(this.fichaArbitral,this.incidencia, this.auditoriaDTO);
				this.incidencia=new IncidenciasDTO();
				

				this.fichaArbitral=registrarFichaArbitroService.obtenerFichaArbitral(this.fichaArbitral);	
				String[] descEstado=repositorioDatos.getDescriptoresEstadoLista(this.fichaArbitral.getEstadoFicha().getIdEstado());
				this.fichaArbitral.getEstadoFicha().setNomEstado(descEstado[2]);
				if(this.fichaArbitral.getTipoFicha().equals(ConstanteWeb.TIPO_FICHA.ARBITRO.toString())){
					if(this.fichaArbitral.getIndModalidadArbitro()!=null){
						this.fichaArbitral.setModalidadArbitro(repositorioDatos.getDescModalidadArbitraje(this.fichaArbitral.getIndModalidadArbitro().longValue() ));
					}else{
						this.fichaArbitral.setModalidadArbitro("No registra");
					}
					
				}if(this.fichaArbitral.getTipoFicha().equals(ConstanteWeb.TIPO_FICHA.SECRETARIO.toString())){
					this.fichaArbitral.setModalidadArbitro(ConstanteWeb.TIPO_FICHA.SECRETARIO.toString());
				}
				
				establecerObjetoSession(ConstanteWeb.FICHA_REGISTRO, this.fichaArbitral);
				
				listaIncidenciasFicha();
				cerrarRegistroPopup();
				RequestContext.getCurrentInstance().update("gridFichaArbitro");
				setMensajeroInfo("Registrado Correctamente");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else{
			setMensajeroError("Complete el Formulario", null);			
		}
	}

	public boolean validarRegistroReestablecer(){
		if(this.reestablecer.getIdMotivo()>0 &&
			this.reestablecer.getIndOrganoEmisor()>0 &&
			this.reestablecer.getIndTipoActo()>0 &&
			this.reestablecer.getDescActo()!=null &&
			this.reestablecer.getDescActo().trim().length()>0 &&
			this.reestablecer.getDescDetalle()!=null &&
			this.reestablecer.getDescDetalle().trim().length()>0){
			return true;
		}else{
			return false;
		}
	}
	public void listaIncidenciasFicha(){
		
		try {
			this.listaIncidencias=registrarIncidenciaService.obtenerIncidenciasFichaArbitral(this.fichaArbitral);
			for (IncidenciasDTO incidenciasDTO : listaIncidencias) {
				String[] desEstado=repositorioDatos.getDescriptoresEstadoLista(incidenciasDTO.getIdEstadoIncidencia());
				
				incidenciasDTO.setEstadoIncidencia(desEstado[0]);				
				incidenciasDTO.setMotivoIncidencia(repositorioDatos.getDescripcionMotivoLista(incidenciasDTO.getIdMotivoIncidencia()));	
				if(incidenciasDTO.getIdIncidencia()==fichaArbitral.getEstadoFicha().getIdIncidencia()){
					incidenciasDTO.setIndActivo(true);
				}
			}
			//establecerObjetoSession(ConstanteWeb.LISTA_INCIDENCIAS, listaIncidencias);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	
	public void listaReestablecimientosFicha(){
		
		try {
			this.listaReestablecimientos=registrarIncidenciaService.obtenerReestablecimientosFichaArbitral(this.fichaArbitral);
			for (ReestablecerDTO reestablecerDTO : listaReestablecimientos) {
				reestablecerDTO.setDescMotivo(repositorioDatos.getDescripcionMotivoLista(reestablecerDTO.getIdMotivo()));
				reestablecerDTO.setDescOrganoEmisor(repositorioDatos.getLabelParametro(reestablecerDTO.getIndOrganoEmisor().longValue()));
				reestablecerDTO.setDescTipoActo(repositorioDatos.getLabelParametro(reestablecerDTO.getIndTipoActo().longValue()));
			}
			establecerObjetoSession(ConstanteWeb.LISTA_REESTABLECER, listaReestablecimientos);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	
	public void guardarReestablecimiento(){
		
		this.auditoriaDTO=(AuditoriaDTO)obtenerObjetoSession(ConstanteWeb.AUDITORIA);
		
		if(validarRegistroReestablecer()){
			try {
				this.reestablecer.setIdFicha(this.fichaArbitral.getIdFicha());
								
				registrarIncidenciaService.insertReestablecimiento(this.fichaArbitral, this.reestablecer, auditoriaDTO);
				this.incidencia=new IncidenciasDTO();
				

				this.fichaArbitral=registrarFichaArbitroService.obtenerFichaArbitral(this.fichaArbitral);	
				String[] descEstado=repositorioDatos.getDescriptoresEstadoLista(this.fichaArbitral.getEstadoFicha().getIdEstado());
				this.fichaArbitral.getEstadoFicha().setNomEstado(descEstado[2]);
				if(this.fichaArbitral.getTipoFicha().equals(ConstanteWeb.TIPO_FICHA.ARBITRO.toString())){
					if(this.fichaArbitral.getIndModalidadArbitro()!=null){
						this.fichaArbitral.setModalidadArbitro(repositorioDatos.getDescModalidadArbitraje(this.fichaArbitral.getIndModalidadArbitro().longValue() ));
					}else{
						this.fichaArbitral.setModalidadArbitro("No registra");
					}
					
				}if(this.fichaArbitral.getTipoFicha().equals(ConstanteWeb.TIPO_FICHA.SECRETARIO.toString())){
					this.fichaArbitral.setModalidadArbitro(ConstanteWeb.TIPO_FICHA.SECRETARIO.toString());
				}
				
				
				establecerObjetoSession(ConstanteWeb.FICHA_REGISTRO, this.fichaArbitral);
				
				listaReestablecimientosFicha();
				cerrarReestabecerPopup();
				setMensajeroInfo("Registrado Correctamente");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else{
			setMensajeroError("Complete el Formulario", null);			
		}
	}
	public void visualizarIncidencia(Long idIncidencia){
		//this.listaIncidencias=(ArrayList)obtenerObjetoSession(ConstanteWeb.LISTA_INCIDENCIAS);
		/**Revisar el Visor de Incidencias*/
		for (IncidenciasDTO incidenciasDTO : this.listaIncidencias) {
			if(incidenciasDTO.getIdIncidencia()==idIncidencia){
				this.incidencia=incidenciasDTO;
				break;
			}
		}
		abrirVisorPopup();
	}
	
	public void abrirPopupReestablecer(){
		
	}

	/**
	 * Metodo que permite obtener listaIncidencias.
	 * @return listaIncidencias , tipo List<IncidenciasDTO>.
	 */
	public List<IncidenciasDTO> getListaIncidencias() {
		return listaIncidencias;
	}

	/**
	 * Permite actualizar listaIncidencias.
	 * @param listaIncidencias, tipo List<IncidenciasDTO>.
	 */
	public void setListaIncidencias(List<IncidenciasDTO> listaIncidencias) {
		this.listaIncidencias = listaIncidencias;
	}

	/**
	 * Metodo que permite obtener this.incidencia.
	 * @return incidencia , tipo IncidenciasDTO.
	 */
	public IncidenciasDTO getIncidencia() {
		return this.incidencia;
	}

	/**
	 * Permite actualizar this.incidencia.
	 * @param incidencia, tipo IncidenciasDTO.
	 */
	public void setIncidencia(IncidenciasDTO incidencia) {
		this.incidencia = incidencia;
	}

	/**
	 * Metodo que permite obtener listaReestablecimientos.
	 * @return listaReestablecimientos , tipo List<ReestablecerDTO>.
	 */
	public List<ReestablecerDTO> getListaReestablecimientos() {
		return listaReestablecimientos;
	}

	/**
	 * Permite actualizar listaReestablecimientos.
	 * @param listaReestablecimientos, tipo List<ReestablecerDTO>.
	 */
	public void setListaReestablecimientos(
			List<ReestablecerDTO> listaReestablecimientos) {
		this.listaReestablecimientos = listaReestablecimientos;
	}

	/**
	 * Metodo que permite obtener reestablecer.
	 * @return reestablecer , tipo ReestablecerDTO.
	 */
	public ReestablecerDTO getReestablecer() {
		return reestablecer;
	}

	/**
	 * Permite actualizar reestablecer.
	 * @param reestablecer, tipo ReestablecerDTO.
	 */
	public void setReestablecer(ReestablecerDTO reestablecer) {
		this.reestablecer = reestablecer;
	}

	
}
